/**
 * Classe chargée de la génération du code en rapport avec les affectations de valeur
 * 
 * @author BlobbyCompiloTeam
 *
 */


public class GenerationAffectation implements GramConstants{

	private static MaP map; // Référence vers la machine à pile qui génère le code assembleur ou YVM
	private IdVar ident; // L'identifiant de la variable qui recevoir la valeur à affecter
	
	/**
	 * Constructeur de la classe GenerationAffectation
	 * @param _map Une référence vers la machine à pile pour lancer les ordres de génération de code de la classe
	 */
	public GenerationAffectation(MaP _map){
		map = _map;
	}

	/**
	 * Modificateur du membre Ident
	 * @param ident L'identifiant de la variable qui va recevoir la valeur à affecter
	 */
	public void setIdent(Ident ident) {
		if (ident.getNature() == natVar){
			this.ident = (IdVar)ident;
		}else{
			this.ident = null;
			MsgErreur.getErreur(Gram.token.beginLine, "GenerationAffectation.setIdent", "L'ident courant ne peut être affecté à cause de sa Nature (Constante ou Parametre)");
		}
		
	}
	
	/**
	 * Permet de vérifier le type de la valeur à affecter. Affiche une erreur s'il y a incompatibilité de types. Fait appel à la classe ControleType.
	 * @param type Le type de la valeur à affecter
	 */ 
	public void affect(int type){
		if (ident != null){
			// Affiche une erreur si le controle de type indique une incompatibilité
			if (!ControleType.controleBinaire(type, ident.getType(), opEg)){
				MsgErreur.getErreur(Gram.token.beginLine, "GenerationAffectation.affect", "Erreur d'affectation : les types ne correspondent pas");
			}
			map.aff_var(ident.getOffset());
		}
	}
}

